﻿// owner 蒋家伟
#pragma once
#include "Correspond_home.h"
#include "WeakReference.h"

namespace jsdk
{
    class ISocketEventHandler;
    // 类别描述 : Tcp套接字
    // 实现细节 : 内部启动了一个线程去监听TcpSocket，所有的信息都会调用Handler给外部
    // 业务逻辑 : 全部逻辑都放到ISocketEventHandler实现
    // 注意     : 创建对象不会立马启动线程，而是等待Connect之后启动。
    class CORRESPOND_EXPORT ISocket : public WeakReference
    {
    public:
        virtual ~ISocket() {};
        static OwnerPtr<ISocket> create(ISocketEventHandler * pSocketEventHandler = nullptr);

    public:
        /// \ 是否在线工作
        virtual bool isOnLine() const = 0;

        /// \ 链接
        /// \ note : 调用此接口后启动socket子线程，Create并不会启动
        /// \ in ip         目标ip地址
        /// \ in port       端口号
        /// \ return true 链接成功 or 失败
        virtual void connected(const std::string& ip, int64_t port) = 0;

        /// \ 重新链接
        /// \ note : 需要连接之后才可以调用
        /// \ in ip         目标ip地址
        /// \ in port       端口号
        /// \ return true 重新链接成功 or 失败
        virtual void reconnect(const std::string& ip, int64_t port) const = 0;

        /// \ 发送消息
        /// \ in msg        发送的数据
        /// \ in length     发送的数据长度
        virtual void send(std::string&& msg, int64_t length) const = 0;
    };
}